package lv.clientedisqueria.view.disco;

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;

import lv.clientedisqueria.controller.Controller;
import lv.clientedisqueria.model.disco.DiscoModel;
import lv.clientedisqueria.view.AbstractPanel;
import lv.mensajeriadisqueria.idomain.IColeccion;
import lv.mensajeriadisqueria.idomain.IDisco;
import lv.mensajeriadisqueria.idomain.IEstilo;
import lv.mensajeriadisqueria.idomain.ITipoSoporte;



@SuppressWarnings("serial")
public class DiscoPanel extends AbstractPanel<IDisco>{

	private final Controller<IDisco> controller;

	private JTable discoTabla;

	private JLabel nombreLbl, descripcionContenidoLbl, descripcionAutorLbl, companiaLbl, anioEdicionLbl;
	private JLabel soporteLbl,estiloLbl, ubicacionLbl,leyendaLbl, paisLbl,coleccionesLbl;
	private JTextField nombreTF, descripcionContenidoTF, descripcionAutorTF,leyendaTF, paisTF;
	private JTextField companiaTF, anioEdicionTF, ubicacionTF;
	private JComboBox estiloCoB, soporteCoB, coleccionCoB;
	private JCheckBox videoChB, obraConceptualChB;
	private JScrollPane scrollPane;
	private JPanel textFieldsPanel; 
	
	private DefaultComboBoxModel estiloComboBoxModel, soporteComboBoxModel,coleccionComboBoxModel;

	private DiscoModel discoModel;
	
	public DiscoPanel(final DiscoModel discoModel) {
		super(discoModel);
		controller = new Controller<IDisco>(discoModel);
		controller.addObserver(this);
		iniciarView();
	}

	private void iniciarView() {
		setLayout(new BorderLayout());
		add(new DiscoMenuBoton(controller), BorderLayout.NORTH);
		
		JPanel panel = new JPanel(new BorderLayout());
		panel.add(getTextFieldsPanel(), BorderLayout.NORTH);
		panel.add(getScrollPane(), BorderLayout.CENTER);
		add(panel, BorderLayout.CENTER);
	}

	
	public Controller<IDisco> getDiscoController() {
		return controller;
	}

	public JScrollPane getScrollPane() {
		if(scrollPane == null) {
			scrollPane = new JScrollPane(getDiscoTabla());
			scrollPane.setAutoscrolls(true);
		}
		return scrollPane;
	}
	
	public JTable getDiscoTabla() {
		if (discoTabla == null) {
			discoTabla = new JTable(controller.getModelo().getTablaModel());
			discoTabla.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			discoTabla.setSelectionModel(controller.getModelo().getTablaModel().getListSelectionModel());
		}
		return discoTabla;
	}
	
	public JTextField getNombreTF() {
		if(nombreTF == null) {
			nombreTF = new JTextField();
			nombreTF.setEnabled(false);
			
		}
		return nombreTF;
	}

	public JLabel getNombreLbl() {
		if(nombreLbl == null) {
			nombreLbl = new JLabel("Nombre");
		}
		return nombreLbl;
	}

	public JLabel getEstiloLbl() {
		if(estiloLbl == null){
			estiloLbl = new JLabel("Estilo");
		}
		return estiloLbl;
	} 

	public JComboBox getEstiloCoB() {
		if(estiloCoB == null){
			estiloComboBoxModel = new DefaultComboBoxModel(discoModel.buscarEstilo().toArray());
			estiloComboBoxModel.setSelectedItem(((IDisco)controller.getModelo()
					.getTablaModel().getSeleccionado()).getEstilo());
			estiloCoB = new JComboBox(estiloComboBoxModel);
			estiloCoB.setEnabled(false);		
			
		}
		return estiloCoB;
	}

	public JLabel getSoporteLbl() {
		if(soporteLbl == null){
			soporteLbl = new JLabel("Soporte");
		}
		return soporteLbl;
	} 
	
	public JComboBox getSoporteCoB() {
		if(soporteCoB == null){
			soporteComboBoxModel = new DefaultComboBoxModel(discoModel.buscarSoporte().toArray());
			soporteComboBoxModel.setSelectedItem(((IDisco)controller.getModelo()
					.getTablaModel().getSeleccionado()).getTipoSoporte());
			soporteCoB = new JComboBox(soporteComboBoxModel);
			soporteCoB.setEnabled(false);			
		}
		return soporteCoB;
	}

	public JLabel getColeccionLbl() {
		if(coleccionesLbl == null){
			coleccionesLbl = new JLabel("Colecciones");
		}
		return coleccionesLbl;
	} 
	
	public JComboBox getColeccionCoB() {
		if(coleccionCoB == null){
			coleccionComboBoxModel = new DefaultComboBoxModel(discoModel.buscarColecciones().toArray());
			coleccionComboBoxModel.setSelectedItem(((IDisco)controller.getModelo()
					.getTablaModel().getSeleccionado()).getColeccion());
			coleccionCoB = new JComboBox(coleccionComboBoxModel);
			coleccionCoB.setEnabled(false);		
			
		}
		return coleccionCoB;
	}

		
	public JLabel getDescripcionContenidoLbl() {
		if(descripcionContenidoLbl == null){
			descripcionContenidoLbl = new JLabel("Descripcion de Contenido");
		}
		return descripcionContenidoLbl;
	}

	public JTextField getDescripcionContenidoTF() {
		if(descripcionContenidoTF == null){
			descripcionContenidoTF = new JTextField();
			descripcionContenidoTF.setEnabled(false);
		}
		return descripcionContenidoTF;
	}
	
	public JLabel getDescripcionAutorLbl() {
		if(descripcionAutorLbl == null){
			descripcionAutorLbl = new JLabel("Descripcion de Autor");
		}
		return descripcionAutorLbl;
	}

	public JTextField getDescripcionAutorTF() {
		if(descripcionAutorTF == null){
			descripcionAutorTF = new JTextField();
			descripcionAutorTF.setEnabled(false);
		}
		return descripcionAutorTF;
	}

	public JLabel getCompaniaLbl() {
		if(companiaLbl == null) {
			companiaLbl = new JLabel("Compa��a");
		}
		return companiaLbl;
	}

	public JTextField getCompaniaTF() {
		if(companiaTF == null) {
			companiaTF = new JTextField();
			companiaTF.setEnabled(false);
		}
		return companiaTF;
	}
	
	public JLabel getLeyendaLbl() {
		if(leyendaLbl == null) {
			leyendaLbl = new JLabel("Leyenda");
		}
		return leyendaLbl;
	}

	public JTextField getLeyendaTF() {
		if(leyendaTF == null) {
			leyendaTF = new JTextField();
			leyendaTF.setEnabled(false);
		}
		return leyendaTF;
	}
	
	public JLabel getUbicacionLbl() {
		if(ubicacionLbl == null) {
			ubicacionLbl = new JLabel("Ubicacion");
		}
		return ubicacionLbl;
	}

	public JTextField getUbicacionTF() {
		if(ubicacionTF == null) {
			ubicacionTF = new JTextField();
			ubicacionTF.setEnabled(false);
			
		}
		return ubicacionTF;
	}

	public JLabel getPaisLbl() {
		if(paisLbl == null) {
			paisLbl = new JLabel("Pais");
		}
		return paisLbl;
	}

	public JTextField getPaisTF() {
		if(paisTF == null) {
			paisTF = new JTextField();
			paisTF.setEnabled(false);
			
		}
		return paisTF;
	}
	
	public JLabel getAnioEdicionLbl() {
		if(anioEdicionLbl == null) {
			anioEdicionLbl = new JLabel("A�o de Edicion");
		}
		return anioEdicionLbl;
	}
	
	public JTextField getAnioEdicionTF() {
		if(anioEdicionTF == null) {
			anioEdicionTF = new JTextField();
			anioEdicionTF.setEnabled(false);
			
		}
		return anioEdicionTF;	}

	
	
	 public JCheckBox getVideoChB() {
		if (videoChB == null){
			videoChB = new JCheckBox("Video");
		}		
		return videoChB;
	}

	public JCheckBox getObraConceptualChB() {
		if (obraConceptualChB == null){
			obraConceptualChB = new JCheckBox("Obra Conceptual");
		}		
		return obraConceptualChB;
	}

	public JPanel getTextFieldsPanel() {
		if(textFieldsPanel == null){
			textFieldsPanel = new JPanel(new GridLayout(12,12));
			textFieldsPanel.add(getNombreLbl());
			textFieldsPanel.add(getNombreTF());
			textFieldsPanel.add(getCompaniaLbl());
			textFieldsPanel.add(getCompaniaTF());
			textFieldsPanel.add(getAnioEdicionLbl());
			textFieldsPanel.add(getAnioEdicionTF());
			textFieldsPanel.add(getDescripcionAutorLbl());
			textFieldsPanel.add(getDescripcionAutorTF());
			textFieldsPanel.add(getDescripcionContenidoLbl());
			textFieldsPanel.add(getDescripcionContenidoTF());
			textFieldsPanel.add(getLeyendaLbl());
			textFieldsPanel.add(getLeyendaTF());
			textFieldsPanel.add(getPaisLbl());
			textFieldsPanel.add(getPaisTF());
			textFieldsPanel.add(getUbicacionLbl());
			textFieldsPanel.add(getUbicacionTF());
			textFieldsPanel.add(getEstiloLbl());
			textFieldsPanel.add(getEstiloCoB());
			textFieldsPanel.add(getSoporteLbl());
			textFieldsPanel.add(getSoporteCoB());
			textFieldsPanel.add(getObraConceptualChB());
			textFieldsPanel.add(getVideoChB());
			textFieldsPanel.validate();
			
			IDisco disco = (IDisco)controller.getModelo()
				.getTablaModel().getSeleccionado();

			if(disco != null){
				actualizarCampos(disco);
			}
		}
		
		return textFieldsPanel;
	}
	
	
	protected IDisco actualizarDomain(IDisco disco) {
		disco.setNombre(getNombreTF().getText());
		disco.setCompania(String.valueOf(getCompaniaTF().getText()));
		disco.setAnioEdicion(Integer.valueOf(String.valueOf(getAnioEdicionTF().getText())));
		disco.setDescripcionAutor(getDescripcionAutorTF().getText());
		disco.setDescripcionContenido(getDescripcionContenidoTF().getText());
		disco.setLeyenda(getLeyendaTF().getText());
		disco.setPais(getPaisTF().getText());
		disco.setEstilo((IEstilo) estiloComboBoxModel.getSelectedItem());
		disco.setTipoSoporte((ITipoSoporte)soporteComboBoxModel.getSelectedItem());
		disco.setVideo(getVideoChB().isSelected()); 
		disco.setObraConceptual(getObraConceptualChB().isSelected()); 
		disco.setColeccion((IColeccion)coleccionComboBoxModel.getSelectedItem());
		disco.setUbicacion(getUbicacionTF().getText());
		return disco;
	}

	protected void iniciarCampos() {
		nombreTF.setText("");
		companiaTF.setText("");
		anioEdicionTF.setText("");
		descripcionAutorTF.setText("");
		descripcionContenidoTF.setText("");
		leyendaTF.setText("");
		paisTF.setText("");
		estiloCoB.setSelectedIndex(0);
		soporteCoB.setSelectedIndex(0);
		videoChB.setEnabled(true);
		obraConceptualChB.setEnabled(true);
		coleccionCoB.setSelectedIndex(0);
		ubicacionTF.setText("");
	}

	/**
	 * Habilita y dehabilita los text field dependiendo del parametro
	 * @param habilitar
	 */
	protected void habilitarTextField(boolean habilitar) {
		nombreTF.setEnabled(habilitar);
		companiaTF.setEnabled(habilitar);
		anioEdicionTF.setEnabled(habilitar);
		descripcionAutorTF.setEnabled(habilitar);
		descripcionContenidoTF.setEnabled(habilitar);
		leyendaTF.setEnabled(habilitar);
		paisTF.setEnabled(habilitar);
		estiloCoB.setEnabled(habilitar);
		soporteCoB.setEnabled(habilitar);
		videoChB.setEnabled(habilitar);
		obraConceptualChB.setEnabled(habilitar);
		coleccionCoB.setEnabled(habilitar);
		ubicacionTF.setEnabled(habilitar);		
	}

	protected void actualizarTabla() {
		discoTabla.updateUI();
	}

	protected Controller<IDisco> getController() {
		return this.controller;
	}

	protected void actualizarCampos(IDisco disco) {
		getNombreTF().setText(disco.getNombre());
		getCompaniaTF().setText(disco.getCompania());
		getAnioEdicionTF().setText(String.valueOf(((IDisco)controller.getModelo().getTablaModel().
				getSeleccionado()).getAnioEdicion()));
		getDescripcionAutorTF().setText(disco.getDescripcionAutor());
		getDescripcionContenidoTF().setText(disco.getDescripcionContenido());
		getLeyendaTF().setText(disco.getLeyenda());
		getPaisTF().setText(disco.getPais());
		getEstiloCoB().setSelectedItem(disco.getEstilo());
		getSoporteCoB().setSelectedItem(disco.getTipoSoporte());
		getVideoChB().setSelected(disco.getVideo());
		getObraConceptualChB().setSelected(disco.getObraConceptual());
		getColeccionCoB().setSelectedItem(disco.getColeccion());
		getUbicacionTF().setText(disco.getUbicacion());
		DiscoPanel.this.repaint();
	}
	
}
